// NFT URI 使用示例
// 展示基础URI和合约URI的区别和用法

const { ethers } = require('ethers');

// 示例：URI配置和使用
class NFTURIExample {
    constructor() {
        // 基础URI示例
        this.baseURIExamples = {
            ipfs: "ipfs://QmYourMetadataHash/",
            http: "https://api.mynft.com/metadata/",
            local: "https://mynft.com/api/tokens/"
        };

        // 合约URI示例
        this.contractURIExamples = {
            ipfs: "ipfs://QmContractMetadataHash",
            http: "https://api.mynft.com/contract-metadata.json"
        };
    }

    // 展示基础URI的工作原理
    demonstrateBaseURI() {
        console.log("🔍 基础URI (Base URI) 工作原理");
        console.log("=" * 50);

        Object.entries(this.baseURIExamples).forEach(([type, baseURI]) => {
            console.log(`\n📁 ${type.toUpperCase()} 格式:`);
            console.log(`   基础URI: ${baseURI}`);

            // 模拟不同Token ID的完整URI
            for (let tokenId = 1; tokenId <= 3; tokenId++) {
                const fullURI = `${baseURI}${tokenId}`;
                console.log(`   Token ${tokenId}: ${fullURI}`);
            }
        });
    }

    // 展示合约URI的内容
    demonstrateContractURI() {
        console.log("\n\n🔍 合约URI (Contract URI) 内容示例");
        console.log("=" * 50);

        const contractMetadata = {
            name: "My Learning NFT Collection",
            description: "这是一个用于学习NFT开发的示例集合，展示了各种数字艺术形式。",
            image: "ipfs://QmCollectionImageHash",
            external_link: "https://mylearningnft.com",
            seller_fee_basis_points: 250, // 2.5% 版税
            fee_recipient: "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6"
        };

        console.log("📄 合约元数据JSON:");
        console.log(JSON.stringify(contractMetadata, null, 2));

        console.log("\n🌐 在OpenSea上的显示效果:");
        console.log("- 集合名称:", contractMetadata.name);
        console.log("- 集合描述:", contractMetadata.description);
        console.log("- 集合图片:", contractMetadata.image);
        console.log("- 外部链接:", contractMetadata.external_link);
        console.log("- 版税比例:", contractMetadata.seller_fee_basis_points / 100, "%");
    }

    // 展示实际使用场景
    demonstrateUsage() {
        console.log("\n\n🚀 实际使用场景");
        console.log("=" * 50);

        console.log("1️⃣ 部署时设置基础URI:");
        console.log("   await contract.setBaseURI('ipfs://QmYourHash/');");

        console.log("\n2️⃣ 设置合约URI:");
        console.log("   await contract.setContractURI('ipfs://QmContractHash');");

        console.log("\n3️⃣ 铸造NFT:");
        console.log("   const tokenId = await contract.mintNFT(recipient, '1');");
        console.log("   // 最终URI: ipfs://QmYourHash/1");

        console.log("\n4️⃣ 查询Token URI:");
        console.log("   const tokenURI = await contract.tokenURI(1);");
        console.log("   // 返回: ipfs://QmYourHash/1");

        console.log("\n5️⃣ 查询合约URI:");
        console.log("   const contractURI = await contract.contractURI();");
        console.log("   // 返回: ipfs://QmContractHash");
    }

    // 展示元数据文件结构
    demonstrateMetadataStructure() {
        console.log("\n\n📁 元数据文件结构");
        console.log("=" * 50);

        console.log("🗂️  IPFS文件结构:");
        console.log("   /");
        console.log("   ├── contract-metadata.json    (合约URI指向的文件)");
        console.log("   ├── collection-image.png      (集合图片)");
        console.log("   └── tokens/");
        console.log("       ├── 1.json                (Token 1的元数据)");
        console.log("       ├── 2.json                (Token 2的元数据)");
        console.log("       └── 3.json                (Token 3的元数据)");

        console.log("\n📄 Token元数据示例 (1.json):");
        const tokenMetadata = {
            name: "My Learning NFT #1",
            description: "这是我的第一个学习NFT，展示了基础的数字艺术。",
            image: "ipfs://QmTokenImageHash1",
            attributes: [
                {
                    trait_type: "Color",
                    value: "Blue"
                },
                {
                    trait_type: "Rarity",
                    value: "Common"
                }
            ]
        };
        console.log(JSON.stringify(tokenMetadata, null, 2));
    }

    // 展示OpenSea集成
    demonstrateOpenSeaIntegration() {
        console.log("\n\n🌊 OpenSea集成效果");
        console.log("=" * 50);

        console.log("📱 在OpenSea上显示:");
        console.log("   ┌─────────────────────────────────┐");
        console.log("   │  My Learning NFT Collection     │");
        console.log("   │  [集合图片]                      │");
        console.log("   │  这是一个用于学习NFT开发的示例集合 │");
        console.log("   │  🌐 访问网站                     │");
        console.log("   │  💰 版税: 2.5%                  │");
        console.log("   └─────────────────────────────────┘");

        console.log("\n🎨 单个NFT显示:");
        console.log("   ┌─────────────────────────────────┐");
        console.log("   │  My Learning NFT #1             │");
        console.log("   │  [NFT图片]                       │");
        console.log("   │  这是我的第一个学习NFT           │");
        console.log("   │  🔵 Color: Blue                 │");
        console.log("   │  ⭐ Rarity: Common              │");
        console.log("   └─────────────────────────────────┘");
    }

    // 运行所有示例
    runAllExamples() {
        console.log("🎯 NFT URI 完整示例演示");
        console.log("=" * 60);

        this.demonstrateBaseURI();
        this.demonstrateContractURI();
        this.demonstrateUsage();
        this.demonstrateMetadataStructure();
        this.demonstrateOpenSeaIntegration();

        console.log("\n\n✅ 总结:");
        console.log("🔹 基础URI: 用于构建Token的元数据URI");
        console.log("🔹 合约URI: 用于描述整个NFT集合的信息");
        console.log("🔹 两者配合使用，提供完整的NFT元数据体验");
    }
}

// 运行示例
const example = new NFTURIExample();
example.runAllExamples();
